<!DOCTYPE html>
<!-- saved from url=(0047)https://www.cnblogs.com/aspirant/p/9002663.html -->
<html lang="zh-cn"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="referrer" content="never">
    <meta property="og:description" content="一、Dubbo结构图 duubo结构图 我们解释以下这个架构图：Consumer服务消费者，Provider服务提供者。Container服务容器。消费当然是invoke提供者了，invoke这条实线">
    <meta http-equiv="Cache-Control" content="no-transform">
    <meta http-equiv="Cache-Control" content="no-siteapp">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园</title>
    
    <link rel="stylesheet" href="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/blog-common.min.css">
    <link id="MainCss" rel="stylesheet" href="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/bundle-codinglife.min.css">
    
    <link id="mobile-style" media="only screen and (max-width: 767px)" type="text/css" rel="stylesheet" href="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/bundle-codinglife-mobile.min.css">
    
    <link type="application/rss+xml" rel="alternate" href="https://www.cnblogs.com/aspirant/rss">
    <link type="application/rsd+xml" rel="EditURI" href="https://www.cnblogs.com/aspirant/rsd.xml">
    <link type="application/wlwmanifest+xml" rel="wlwmanifest" href="https://www.cnblogs.com/aspirant/wlwmanifest.xml">
    <script src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/amp4ads-host-v0.js.下载"></script><script src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/pubads_impl_rendering_2020013001.js.下载"></script><script async="" src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/analytics.js.下载"></script><script src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/jquery-2.2.0.min.js.下载"></script>
    <script src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/blog-common.min.js.下载"></script>
    <script>
        var currentBlogId = 72100;
        var currentBlogApp = 'aspirant';
        var cb_enable_mathjax = false;
        var isLogined = false;
    </script>
    
    
    
<link rel="preload" href="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/f.txt" as="script"><script type="text/javascript" src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/f.txt"></script><script src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/pubads_impl_2020013001.js.下载" async=""></script><link rel="prefetch" href="https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html"></head>
<body style="">
    <a name="top"></a>
    
    
<!--done-->
<div id="home">
<div id="header">
	<div id="blogTitle">
        <a id="lnkBlogLogo" href="https://www.cnblogs.com/aspirant/"><img id="blogLogo" src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/logo.gif" alt="返回主页"></a>		
		
<!--done-->
<h1><a id="Header1_HeaderTitle" class="headermaintitle HeaderMainTitle" href="https://www.cnblogs.com/aspirant/">至尊宝</a>
</h1>
<h2>
转眼间自己35岁了，无法做管理的自己又该何去何从
</h2>




		
	</div><!--end: blogTitle 博客的标题和副标题 -->
	<div id="navigator">
		
<ul id="navList">
<li><a id="blog_nav_sitehome" class="menu" href="https://www.cnblogs.com/">
博客园</a>
</li>
<li>
<a id="blog_nav_myhome" class="menu" href="https://www.cnblogs.com/aspirant/">
首页</a>
</li>
<li>

<a id="blog_nav_newpost" class="menu" href="https://i.cnblogs.com/EditPosts.aspx?opt=1">
新随笔</a>
</li>
<li>
<a id="blog_nav_contact" class="menu" href="https://msg.cnblogs.com/send/aspirant">
联系</a></li>
<li>
<a id="blog_nav_rss" class="menu" href="https://www.cnblogs.com/aspirant/rss/">
订阅</a>
<!--<partial name="./Shared/_XmlLink.cshtml" model="Model" /></li>--></li>
<li>
<a id="blog_nav_admin" class="menu" href="https://i.cnblogs.com/">
管理</a>
</li>
</ul>


		<div class="blogStats">
			
			<span id="stats_post_count">随笔 - 
665&nbsp; </span>
<span id="stats_article_count">文章 - 
2&nbsp; </span>
<span id="stats-comment_count">评论 - 
133</span>

			
		</div><!--end: blogStats -->
	</div><!--end: navigator 博客导航栏 -->
</div><!--end: header 头部 -->

<div id="main">
	<div id="mainContent">
	<div class="forFlow">
		<div id="post_detail">
    <!--done-->
    <div id="topics">
        <div class="post">
            <h1 class="postTitle">
                
<a id="cb_post_title_url" class="postTitle2" href="https://www.cnblogs.com/aspirant/p/9002663.html">Dubbo学习(六) dubbo 架构图 以及调用过程</a>

            </h1>
            <div class="clear"></div>
            <div class="postBody">
                
<div id="cnblogs_post_body" class="blogpost-body ">
    <h2>一、Dubbo结构图</h2>
<div>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill">&nbsp;</div>
<div class="image-view" data-width="450" data-height="300"><img src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/137084-20180507144228272-1688347553.png" alt=""></div>
</div>
<div class="image-caption">duubo结构图</div>
</div>
<p>我们解释以下这个架构图：<br>Consumer服务消费者，Provider服务提供者。Container服务容器。消费当然是invoke提供者了，invoke这条实线按照图上的说明当然同步的意思了。但是在实际调用过程中，Provider的位置对于Consumer来说是透明的，上一次调用服务的位置（IP地址）和下一次调用服务的位置，是不确定的。这个地方就需要使用注册中心来实现软负载。<br><strong>Register</strong><br>服务提供者先启动start，然后注册register服务。消费订阅subscribe服务，如果没有订阅到自己想获得的服务，它会不断的尝试订阅。新的服务注册到注册中心以后，注册中心会将这些服务通过notify到消费者。<br><strong>Monitor</strong><br>这是一个监控，图中虚线表明Consumer 和Provider通过异步的方式发送消息至Monitor，Consumer和Provider会将信息存放在本地磁盘，平均1min会发送一次信息。Monitor在整个架构中是可选的（图中的虚线并不是可选的意思），Monitor功能需要单独配置，不配置或者配置以后，Monitor挂掉并不会影响服务的调用。</p>
<h2>二、Dubbo原理</h2>
<p><strong>初始化过程细节：</strong>&nbsp;第一步，就是将服务装载容器中，然后准备注册服务。和spring中启动过程类似，spring启动时，将bean装载进容器中的时候，首先要解析bean。所以dubbo也是先读配置文件解析服务。</p>
<h6><strong>解析服务：</strong></h6>
<p>1）、基于dubbo.jar内的Meta-inf/spring.handlers配置，spring在遇到dubbo名称空间时，会回调DubboNamespaceHandler类。<br>2）、所有的dubbo标签，都统一用DubboBeanDefinitionParser进行解析，基于一对一属性映射，将XML标签解析为Bean对象。生产者或者消费者初始化的时候，会将Bean对象转会为url格式，将所有Bean属性转成url的参数。 然后将URL传给Protocol扩展点，基于扩展点的Adaptive机制，根据URL的协议头，进行不同协议的服务暴露和引用。</p>
<h6><strong>暴露服务：</strong></h6>
<p>a、 直接暴露服务端口<br>在没有使用注册中心的情况，这种情况一般适用在开发环境下，服务的调用这和提供在同一个IP上，只需要打开服务的端口即可。 即，当配置 or ServiceConfig解析出的URL的格式为： Dubbo：//service-host/com.xxx.TxxService?version=1.0.0 基于扩展点的Adaptiver机制，通过URL的“dubbo：//”协议头识别，直接调用DubboProtocol的export（）方法，打开服务端口。</p>
<p>b、向注册中心暴露服务：<br>和上一种的区别：需要将服务的IP和端口一同暴露给注册中心。 ServiceConfig解析出的url格式为：&nbsp;<a href="https://link.jianshu.com/?t=registry://registry-host/com.alibaba.dubbo.registry.RegistryService?export=URL.encode(" rel="nofollow" target="_blank">registry://registry-host/com.alibaba.dubbo.registry.RegistryService?export=URL.encode(</a>“<a href="https://link.jianshu.com/?t=dubbo://service-host/com.xxx.TxxService?version=1.0.0" rel="nofollow" target="_blank">dubbo://service-host/com.xxx.TxxService?version=1.0.0</a>”)<br>基于扩展点的Adaptive机制，通过URL的“registry：//”协议头识别，调用RegistryProtocol的export方法，将export参数中的提供者URL先注册到注册中心，再重新传给Protocol扩展点进行暴露： Dubbo：//service-host/com.xxx.TxxService?version=1.0.0</p>
<h6><strong>引用服务：</strong></h6>
<p>a、直接引用服务：<br>在没有注册中心的，直连提供者情况下， ReferenceConfig解析出的URL格式为： Dubbo：//service-host/com.xxx.TxxService?version=1.0.0<br>基于扩展点的Adaptive机制，通过url的“dubbo：//”协议头识别，直接调用DubboProtocol的refer方法，返回提供者引用。</p>
<p>b、从注册中心发现引用服务：<br>此时，ReferenceConfig解析出的URL的格式为： <a href="https://link.jianshu.com/?t=registry://registry-host/com.alibaba.dubbo.registry.RegistryService?refer=URL.encode(" rel="nofollow" target="_blank">registry://registry-host/com.alibaba.dubbo.registry.RegistryService?refer=URL.encode(</a>“<a href="https://link.jianshu.com/?t=consumer://consumer-host/com.foo.FooService?version=1.0.0" rel="nofollow" target="_blank">consumer://consumer-host/com.foo.FooService?version=1.0.0</a>”)<br>基于扩展点的Apaptive机制，通过URL的“registry：//”协议头识别，就会调用RegistryProtocol的refer方法，基于refer参数总的条件，查询提供者URL，如： Dubbo：//service-host/com.xxx.TxxService?version=1.0.0<br>基于扩展点的Adaptive机制，通过提供者URL的“dubbo：//”协议头识别，就会调用DubboProtocol的refer（）方法，得到提供者引用。 然后RegistryProtocol将多个提供者引用，通过Cluster扩展点，伪装成单个提供这引用返回。</p>
<h2>三、服务提供与消费详细过程</h2>
<p>&nbsp;</p>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill">&nbsp;</div>
<div class="image-view" data-width="444" data-height="566"><img src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/137084-20180507144238016-1225901922.png" alt=""></div>

</div>
<div class="image-caption">服务提供者暴露一个服务的详细过程</div>

</div>

<br><strong>暴露服务的主过程：</strong><br>首先ServiceConfig类拿到对外提供服务的实际类ref，然后将ProxyFactory类的getInvoker方法使用ref生成一个AbstractProxyInvoker实例，到这一步就完成具体服务到invoker的转化。接下来就是Invoker转换到Exporter的过程。 Dubbo处理服务暴露的关键就在Invoker转换到Exporter的过程，下面我们以Dubbo和rmi这两种典型协议的实现来进行说明： Dubbo的实现： Dubbo协议的Invoker转为Exporter发生在DubboProtocol类的export方法，它主要是打开socket侦听服务，并接收客户端发来的各种请求，通讯细节由dubbo自己实现。 Rmi的实现： RMI协议的Invoker转为Exporter发生在RmiProtocol类的export方法，他通过Spring或Dubbo或JDK来实现服务，通讯细节由JDK底层来实现。
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill">&nbsp;</div>
<div class="image-view" data-width="379" data-height="502"><img src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/137084-20180507144245813-1747005959.png" alt=""></div>

</div>
<div class="image-caption">服务消费的主过程</div>

</div>

<br><strong>服务消费的主过程：</strong><br>首先ReferenceConfig类的init方法调用Protocol的refer方法生成Invoker实例。接下来把Invoker转为客户端需要的接口
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="article-title-box">
<h6 class="title-article">&nbsp;分布式服务框架：</h6>

</div>
<div id="article_content" class="article_content csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post">
<div class="htmledit_views">
<pre>–高性能和透明化的RPC远程服务调用方案
</pre>
<pre>–SOA服务治理方案</pre>
<pre>-Apache MINA&nbsp;框架基于Reactor模型通信框架，基于tcp长连接</pre>
<pre></pre>
<pre>Dubbo缺省协议采用单一长连接和NIO异步通讯，</pre>
<pre>适合于小数据量大并发的服务调用，以及服务消费者机器数远大于服务提供者机器数的情况
</pre>
<pre>分析源代码，基本原理如下：</pre>
<pre></pre>
<div><ol>
<li>client一个线程调用远程接口，生成一个唯一的ID（比如一段随机字符串，UUID等），Dubbo是使用AtomicLong从0开始累计数字的</li>
<li>将打包的方法调用信息（如调用的接口名称，方法名称，参数值列表等），和处理结果的回调对象callback，全部封装在一起，组成一个对象object</li>
<li>向专门存放调用信息的全局ConcurrentHashMap里面put(ID, object)</li>
<li>将ID和打包的方法调用信息封装成一对象connRequest，使用IoSession.write(connRequest)异步发送出去</li>
<li>当前线程再使用callback的get()方法试图获取远程返回的结果，在get()内部，则使用synchronized获取回调对象callback的锁， 再先检测是否已经获取到结果，如果没有，然后调用callback的wait()方法，释放callback上的锁，让当前线程处于等待状态。</li>
<li>服务端接收到请求并处理后，将结果（此结果中包含了前面的ID，即回传）发送给客户端，客户端socket连接上专门监听消息的线程收到消息，分析结果，取到ID，再从前面的ConcurrentHashMap里面get(ID)，从而找到callback，将方法调用结果设置到callback对象里。</li>
<li>监听线程接着使用synchronized获取回调对象callback的锁（因为前面调用过wait()，那个线程已释放callback的锁了），再notifyAll()，唤醒前面处于等待状态的线程继续执行（callback的get()方法继续执行就能拿到调用结果了），至此，整个过程结束。</li>
</ol></div>
<div>
<ul>
<li>当前线程怎么让它“暂停”，等结果回来后，再向后执行？</li>
</ul>
&nbsp; &nbsp; &nbsp;答：先生成一个对象obj，在一个全局map里put(ID,obj)存放起来，再用synchronized获取obj锁，再调用obj.wait()让当前线程处于等待状态，然后另一消息监听线程等到服 务端结果来了后，再map.get(ID)找到obj，再用synchronized获取obj锁，再调用obj.notifyAll()唤醒前面处于等待状态的线程。<br>
<ul>
<li>正如前面所说，Socket通信是一个全双工的方式，如果有多个线程同时进行远程方法调用，这时建立在client server之间的socket连接上会有很多双方发送的消息传递，前后顺序也可能是乱七八糟的，server处理完结果后，将结果消息发送给client，client收到很多消息，怎么知道哪个消息结果是原先哪个线程调用的？</li>

</ul>

</div>
<div>&nbsp; &nbsp; &nbsp;答：使用一个ID，让其唯一，然后传递给服务端，再服务端又回传回来，这样就知道结果是原先哪个线程的了。</div>
<div><img src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/137084-20180509141113869-2056605601.png" alt=""></div>
<div><img src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/137084-20180509141121809-615002124.png" alt=""></div>
<p>&nbsp;</p>

</div>

</div>
<p>&nbsp;</p>

</div>
<p><br><br></p>
<p><strong>总体架构</strong></p>
<div class="postBody">
<div id="cnblogs_post_body" class="blogpost-body">
<p>Dubbo的总体架构，如图所示：</p>
<p><img src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/1147548-20170928141450169-1251868962.png" alt=""></p>
<p>Dubbo框架设计一共划分了10个层，最上面的Service层是留给实际想要使用Dubbo开发分布式服务的开发者实现业务逻辑的接口层。图中左边淡蓝背景的为服务消费方使用的接口，右边淡绿色背景的为服务提供方使用的接口， 位于中轴线上的为双方都用到的接口。<br>下面，结合Dubbo官方文档，我们分别理解一下框架分层架构中，各个层次的设计要点：</p>
<ol>
<li>服务接口层（Service）：该层是与实际业务逻辑相关的，根据服务提供方和服务消费方的业务设计对应的接口和实现。</li>
<li>配置层（Config）：对外配置接口，以ServiceConfig和ReferenceConfig为中心，可以直接new配置类，也可以通过spring解析配置生成配置类。</li>
<li>服务代理层（Proxy）：服务接口透明代理，生成服务的客户端Stub和服务器端Skeleton，以ServiceProxy为中心，扩展接口为ProxyFactory。</li>
<li>服务注册层（Registry）：封装服务地址的注册与发现，以服务URL为中心，扩展接口为RegistryFactory、Registry和RegistryService。可能没有服务注册中心，此时服务提供方直接暴露服务。</li>
<li>集群层（Cluster）：封装多个提供者的路由及负载均衡，并桥接注册中心，以Invoker为中心，扩展接口为Cluster、Directory、Router和LoadBalance。将多个服务提供方组合为一个服务提供方，实现对服务消费方来透明，只需要与一个服务提供方进行交互。</li>
<li>监控层（Monitor）：RPC调用次数和调用时间监控，以Statistics为中心，扩展接口为MonitorFactory、Monitor和MonitorService。</li>
<li>远程调用层（Protocol）：封将RPC调用，以Invocation和Result为中心，扩展接口为Protocol、Invoker和Exporter。Protocol是服务域，它是Invoker暴露和引用的主功能入口，它负责Invoker的生命周期管理。Invoker是实体域，它是Dubbo的核心模型，其它模型都向它靠扰，或转换成它，它代表一个可执行体，可向它发起invoke调用，它有可能是一个本地的实现，也可能是一个远程的实现，也可能一个集群实现。</li>
<li>信息交换层（Exchange）：封装请求响应模式，同步转异步，以Request和Response为中心，扩展接口为Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer。</li>
<li>网络传输层（Transport）：抽象mina和netty为统一接口，以Message为中心，扩展接口为Channel、Transporter、Client、Server和Codec。</li>
<li>数据序列化层（Serialize）：可复用的一些工具，扩展接口为Serialization、 ObjectInput、ObjectOutput和ThreadPool。</li>







</ol>
<p>根据官方提供的，对于上述各层之间关系的描述，如下所示：</p>
<ul>
<li>在RPC中，Protocol是核心层，也就是只要有Protocol + Invoker + Exporter就可以完成非透明的RPC调用，然后在Invoker的主过程上Filter拦截点。</li>
<li>图中的Consumer和Provider是抽象概念，只是想让看图者更直观的了解哪些类分属于客户端与服务器端，不用Client和Server的原因是Dubbo在很多场景下都使用Provider、Consumer、Registry、Monitor划分逻辑拓普节点，保持统一概念。</li>
<li>而Cluster是外围概念，所以Cluster的目的是将多个Invoker伪装成一个Invoker，这样其它人只要关注Protocol层Invoker即可，加上Cluster或者去掉Cluster对其它层都不会造成影响，因为只有一个提供者时，是不需要Cluster的。</li>
<li>Proxy层封装了所有接口的透明化代理，而在其它层都以Invoker为中心，只有到了暴露给用户使用时，才用Proxy将Invoker转成接口，或将接口实现转成Invoker，也就是去掉Proxy层RPC是可以Run的，只是不那么透明，不那么看起来像调本地服务一样调远程服务。</li>
<li>而Remoting实现是Dubbo协议的实现，如果你选择RMI协议，整个Remoting都不会用上，Remoting内部再划为Transport传输层和Exchange信息交换层，Transport层只负责单向消息传输，是对Mina、Netty、Grizzly的抽象，它也可以扩展UDP传输，而Exchange层是在传输层之上封装了Request-Response语义。</li>
<li>Registry和Monitor实际上不算一层，而是一个独立的节点，只是为了全局概览，用层的方式画在一起。</li>







</ul>
<p>Dubbo作为一个分布式服务框架，主要具有如下几个核心的要点：</p>
<p><strong>服务定义</strong><br>&nbsp; &nbsp; 服务是围绕服务提供方和服务消费方的，服务提供方实现服务，而服务消费方调用服务。</p>
<p><strong>服务注册</strong><br>&nbsp; &nbsp; 服务提供方，它需要发布服务，而且由于应用系统的复杂性，服务的数量、类型也不断膨胀；对于服务消费方，它最关心如何获取到它所需要的服务，而面对复杂的应用系统，需要管理大量的服务调用。而且，对于服务提供方和服务消费方来说，他们还有可能兼具这两种角色，即既需要提供服务，有需要消费服务。<br>通过将服务统一管理起来，可以有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。Dubbo提供的注册中心有如下几种类型可供选择：</p>
<ul>
<li>Multicast注册中心</li>
<li>Zookeeper注册中心</li>
<li>Redis注册中心</li>
<li>Simple注册中心</li>







</ul>
<p><strong>服务监控</strong></p>
<p>&nbsp; &nbsp; &nbsp;服务提供方，还是服务消费方，他们都需要对服务调用的实际状态进行有效的监控，从而改进服务质量。</p>
<p><strong>远程通信与信息交换</strong></p>
<p><strong>&nbsp; &nbsp; &nbsp;</strong>远程通信需要指定通信双方所约定的协议，在保证通信双方理解协议语义的基础上，还要保证高效、稳定的消息传输。Dubbo继承了当前主流的网络通信框架，主要包括如下几个：</p>
<ul>
<li>Mina</li>
<li>Netty</li>
<li>Grizzly</li>







</ul>
<p><strong>服务调用</strong></p>
<p>&nbsp; &nbsp; 下面从Dubbo官网直接拿来，看一下基于RPC层，服务提供方和服务消费方之间的调用关系，如图所示：</p>
<p>&nbsp; &nbsp;&nbsp;<img src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/1147548-20170928143017294-1702265087.png" alt=""></p>
<p><strong>节点角色说明：</strong></p>
<ul>
<li>Provider:&nbsp;暴露服务的服务提供方。</li>
<li>Consumer:&nbsp;调用远程服务的服务消费方。</li>
<li>Registry:&nbsp;服务注册与发现的注册中心。</li>
<li>Monitor:&nbsp;统计服务的调用次调和调用时间的监控中心。</li>
<li>Container:&nbsp;服务运行容器。</li>


</ul>
<p>上图中，蓝色的表示与业务有交互，绿色的表示只对Dubbo内部交互。上述图所描述的调用流程如下：</p>
<ul>
<li>服务容器负责启动，加载，运行服务提供者。</li>
<li>服务提供者在启动时，向注册中心注册自己提供的服务。</li>
<li>服务消费者在启动时，向注册中心订阅自己所需的服务。</li>
<li>注册中心返回服务提供者地址列表给消费者，如果有变更，注册中心将基于长连接推送变更数据给消费者。</li>
<li>服务消费者，从提供者地址列表中，基于软负载均衡算法，选一台提供者进行调用，如果调用失败，再选另一台调用。</li>
<li>服务消费者和提供者，在内存中累计调用次数和调用时间，定时每分钟发送一次统计数据到监控中心。</li>


</ul>
<p>接着，将上面抽象的调用流程图展开，详细如图所示：</p>
<p><img src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/1147548-20170928143227981-1007327667.png" alt=""></p>
<p><strong>注册/注销服务</strong><br>&nbsp; &nbsp; 服务的注册与注销，是对服务提供方角色而言，那么注册服务与注销服务的时序图，如图所示：</p>
<p>&nbsp;<img src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/1147548-20170928143328137-563026115.png" alt=""></p>
<p><strong>服务订阅/取消</strong><br>&nbsp; &nbsp; &nbsp;为了满足应用系统的需求，服务消费方的可能需要从服务注册中心订阅指定的有服务提供方发布的服务，在得到通知可以使用服务时，就可以直接调用服务。反过来，如果不需要某一个服务了，可以取消该服务。&nbsp;&nbsp;&nbsp;</p>
<p><strong>Dubbo的模块组成</strong></p>
<p>Dubbo以包结构来组织各个模块，各个模块及其关系，如图所示：</p>
<p><a href="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/dubbo-models.png"><img class="alignnone size-full wp-image-6232" src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/dubbo-models.png" alt="dubbo-models" width="436" height="282"></a></p>
<p>&nbsp;</p>
<p>可以通过Dubbo的代码（使用Maven管理）组织，与上面的模块进行比较。简单说明各个包的情况：</p>
<ul>
<li>dubbo-common 公共逻辑模块，包括Util类和通用模型。</li>
<li>dubbo-remoting 远程通讯模块，相当于Dubbo协议的实现，如果RPC用RMI协议则不需要使用此包。</li>
<li>dubbo-rpc 远程调用模块，抽象各种协议，以及动态代理，只包含一对一的调用，不关心集群的管理。</li>
<li>dubbo-cluster 集群模块，将多个服务提供方伪装为一个提供方，包括：负载均衡、容错、路由等，集群的地址列表可以是静态配置的，也可以是由注册中心下发。</li>
<li>dubbo-registry 注册中心模块，基于注册中心下发地址的集群方式，以及对各种注册中心的抽象。</li>
<li>dubbo-monitor 监控模块，统计服务调用次数，调用时间的，调用链跟踪的服务。</li>
<li>dubbo-config 配置模块，是Dubbo对外的API，用户通过Config使用Dubbo，隐藏Dubbo所有细节。</li>
<li>dubbo-container 容器模块，是一个Standalone的容器，以简单的Main加载Spring启动，因为服务通常不需要Tomcat/JBoss等Web容器的特性，没必要用Web容器去加载服务。<strong style="line-height: 1.5;">&nbsp;</strong></li>


</ul>
<p>&nbsp;<strong>&nbsp;</strong></p>
<p>参考：<a id="cb_post_title_url" class="postTitle2" href="http://www.cnblogs.com/steven520213/p/7606598.html">dubbo实现原理简单介绍</a></p>
<p>参考：<a href="https://www.jianshu.com/p/ad5bc07b1b3e" target="_blank">深入浅出的Dubbo学习之路（一） Dubbo原理浅析</a></p>
<p>参考：<a href="https://blog.csdn.net/paul_wei2008/article/details/19355681" target="_blank">Dubbo基本原理机制</a></p>







</div>







</div>
</div>
<div id="MySignature"></div>
<div class="clear"></div>
<div id="blog_post_info_block"><div id="BlogPostCategory">
    分类: 
            <a href="https://www.cnblogs.com/aspirant/category/1212226.html" target="_blank">Spring Cloud_dubbo等</a></div>


    <div id="blog_post_info">
<div id="green_channel">
        <a href="javascript:void(0);" id="green_channel_digg" onclick="DiggIt(9002663,cb_blogId,1);green_channel_success(this,&#39;谢谢推荐！&#39;);">好文要顶</a>
        <a id="green_channel_follow" onclick="follow(&#39;02140087-6e6d-df11-ba8f-001cf0cd104b&#39;);" href="javascript:void(0);">关注我</a>
    <a id="green_channel_favorite" onclick="AddToWz(cb_entryId);return false;" href="javascript:void(0);">收藏该文</a>
    <a id="green_channel_weibo" href="javascript:void(0);" title="分享至新浪微博" onclick="ShareToTsina()"><img src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/icon_weibo_24.png" alt=""></a>
    <a id="green_channel_wechat" href="javascript:void(0);" title="分享至微信" onclick="shareOnWechat()"><img src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/wechat.png" alt=""></a>
</div>
<div id="author_profile">
    <div id="author_profile_info" class="author_profile_info">
            <a href="https://home.cnblogs.com/u/aspirant/" target="_blank"><img src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/20190419170421.png" class="author_avatar" alt=""></a>
        <div id="author_profile_detail" class="author_profile_info">
            <a href="https://home.cnblogs.com/u/aspirant/">aspirant</a><br>
            <a href="https://home.cnblogs.com/u/aspirant/followees/">关注 - 20</a><br>
            <a href="https://home.cnblogs.com/u/aspirant/followers/">粉丝 - 527</a>
        </div>
    </div>
    <div class="clear"></div>
    <div id="author_profile_honor"></div>
    <div id="author_profile_follow">
                <a href="javascript:void(0);" onclick="follow(&#39;02140087-6e6d-df11-ba8f-001cf0cd104b&#39;);return false;">+加关注</a>
    </div>
</div>
<div id="div_digg">
    <div class="diggit" onclick="votePost(9002663,&#39;Digg&#39;)">
        <span class="diggnum" id="digg_count">2</span>
    </div>
    <div class="buryit" onclick="votePost(9002663,&#39;Bury&#39;)">
        <span class="burynum" id="bury_count">0</span>
    </div>
    <div class="clear"></div>
    <div class="diggword" id="digg_tips">
    </div>
</div>

<script type="text/javascript">
    currentDiggType = 0;
</script></div>
    <div class="clear"></div>
    <div id="post_next_prev">

    <a href="https://www.cnblogs.com/aspirant/p/9002631.html" class="p_n_p_prefix">« </a> 上一篇：    <a href="https://www.cnblogs.com/aspirant/p/9002631.html" title="发布于 2018-05-07 14:43">Dubbo学习(一) Dubbo原理浅析</a>
    <br>
    <a href="https://www.cnblogs.com/aspirant/p/9003255.html" class="p_n_p_prefix">» </a> 下一篇：    <a href="https://www.cnblogs.com/aspirant/p/9003255.html" title="发布于 2018-05-07 16:04">Dubbo学习(九)  Dubbo面试问题</a>

</div>
</div>
            </div>
            <div class="postDesc">posted @ 
<span id="post-date">2018-05-07 14:47</span>&nbsp;
<a href="https://www.cnblogs.com/aspirant/">aspirant</a>&nbsp;
阅读(<span id="post_view_count">17324</span>)&nbsp;
评论(<span id="post_comment_count">1</span>)&nbsp;
<a href="https://i.cnblogs.com/EditPosts.aspx?postid=9002663" rel="nofollow">编辑</a>&nbsp;
<a href="javascript:void(0)" onclick="AddToWz(9002663);return false;">收藏</a></div>
        </div>
	    
	    
    </div><!--end: topics 文章、评论容器-->
</div>
<script src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/highlight.min.js.下载"></script>
<script>markdown_highlight();</script>
<script>
    var allowComments = true, cb_blogId = 72100, cb_blogApp = 'aspirant', cb_blogUserGuid = '02140087-6e6d-df11-ba8f-001cf0cd104b';
    var cb_entryId = 9002663, cb_entryCreatedDate = '2018-05-07 14:47', cb_postType = 1; 
    loadViewCount(cb_entryId);
</script><a name="!comments"></a>
<div id="blog-comments-placeholder">

<div id="comment_pager_top">
    
</div>

<br>
<div class="feedback_area_title">评论列表</div>
<div class="feedbackNoItems"><div class="feedbackNoItems"></div></div>	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
				<div class="feedbackManage">
					&nbsp;&nbsp;

<span class="comment_actions">
    
    
    
    
</span>


				</div>
				
<a href="https://www.cnblogs.com/aspirant/p/9002663.html#4445669" class="layer">#1楼</a>
<a name="4445669" id="comment_anchor_4445669"></a>

        <span id="comment-maxId" style="display:none">4445669</span>
        <span id="comment-maxDate" style="display:none">2019/11/30 下午2:28:25</span>
 
<span class="comment_date">2019-11-30 14:28</span>

 

            <a id="a_comment_author_4445669" href="https://www.cnblogs.com/Goergiana/" target="_blank">睡眠不足的365天</a>

			</div>
			<div class="feedbackCon">
				
<div id="comment_body_4445669" class="blog_comment_body">
    写的真是很棒，感谢分享哦
</div>
        <div class="comment_vote">
            <span class="comment_error" style="color: red"></span>
            <a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(4445669, &#39;Digg&#39;, this.parentElement, false);">
                支持(0)
            </a>
            <a href="javascript:void(0);" class="comment_burry" onclick="return voteComment(4445669, &#39;Bury&#39;, this.parentElement, false);">
                反对(0)
            </a>
        </div>
        <span id="comment_4445669_avatar" style="display:none">
            https://pic.cnblogs.com/face/1354281/20180325100550.png
        </span>

			</div>
		</div>

<div id="comment_pager_bottom">
    
</div>


</div>
<script>
    var commentManager = new blogCommentManager();
    commentManager.renderComments(0);
</script>

<div id="comment_form" class="commentform">
    <a name="commentform"></a>
    <div id="divCommentShow"></div>
    <div id="comment_nav"><span id="span_refresh_tips"></span><a href="javascript:void(0);" onclick="return RefreshCommentList();" id="lnk_RefreshComments" runat="server" clientidmode="Static">刷新评论</a><a href="https://www.cnblogs.com/aspirant/p/9002663.html#" onclick="return RefreshPage();">刷新页面</a><a href="https://www.cnblogs.com/aspirant/p/9002663.html#top">返回顶部</a></div>
    <div id="comment_form_container"><div class="login_tips">
    注册用户登录后才能发表评论，请 
    <a rel="nofollow" href="javascript:void(0);" class="underline" onclick="return login(&#39;commentform&#39;);">登录</a>
     或 
    <a rel="nofollow" href="javascript:void(0);" class="underline" onclick="return register();">注册</a>，
    <a href="https://www.cnblogs.com/">访问</a> 网站首页。
</div></div>
    <div class="ad_text_commentbox" id="ad_text_under_commentbox"></div>
    <div id="ad_t2"><a href="http://www.ucancode.com/index.htm" target="_blank" onclick="ga(&#39;send&#39;, &#39;event&#39;, &#39;Link&#39;, &#39;click&#39;, &#39;T2-ucancode&#39;)">【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库</a><br><a href="https://cloud.tencent.com/act/season?fromSource=gwzcw.3422970.3422970.3422970&amp;utm_medium=cpc&amp;utm_id=gwzcw.3422970.3422970.3422970" target="_blank" onclick="ga(&#39;send&#39;, &#39;event&#39;, &#39;Link&#39;, &#39;click&#39;, &#39;T2-腾讯云&#39;)">【活动】腾讯云服务器推出云产品采购季 1核2G首年仅需99元</a><br><a href="https://cloud.baidu.com/campaign/Annualceremony-2020/index.html?track=cp:dsp|pf:pc|pp:chui-bokeyuan-huodong-20kainiancaigouji-yunchanpin1zhe-cpaxingshi-20200214|pu:cpa-xingshi|ci:2020ndsd|kw:2191279" target="_blank" onclick="ga(&#39;send&#39;, &#39;event&#39;, &#39;Link&#39;, &#39;click&#39;, &#39;T2-百度云&#39;)">【推荐】开年采购季，百度智能云全场云服务器低至1折起</a><br><a href="https://developer.aliyun.com/article/727136?utm_content=g_1000104144" target="_blank" onclick="ga(&#39;send&#39;, &#39;event&#39;, &#39;Link&#39;, &#39;click&#39;, &#39;T2-阿里云开发者社区&#39;)">【推荐】独家下载 |《大数据工程师必读手册》揭秘阿里如何玩转大数据</a><br><a href="https://developer.aliyun.com/article/744375?utm_content=g_1000104137" target="_blank" onclick="ga(&#39;send&#39;, &#39;event&#39;, &#39;Link&#39;, &#39;click&#39;, &#39;T2-阿里云开发者社区&#39;)">【推荐】合辑 | 学习python不可不知的开发者词条汇总！</a><br></div>
    <div id="opt_under_post"></div>
    <script async="async" src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/gpt.js.下载"></script>
    <script>
        var googletag = googletag || {};
        googletag.cmd = googletag.cmd || [];
    </script>
    <script>
        googletag.cmd.push(function () {
            googletag.defineSlot("/1090369/C1", [300, 250], "div-gpt-ad-1546353474406-0").addService(googletag.pubads());
            googletag.defineSlot("/1090369/C2", [468, 60], "div-gpt-ad-1539008685004-0").addService(googletag.pubads());
            googletag.pubads().enableSingleRequest();
            googletag.enableServices();
        });
    </script>
    <div id="cnblogs_c1" class="c_ad_block">
        <div id="div-gpt-ad-1546353474406-0" style="height:250px; width:300px;" data-google-query-id="CKj-g5Hr2ucCFUqTvQod8ZcKBg"><div id="google_ads_iframe_/1090369/C1_0__container__" style="border: 0pt none;"><iframe id="google_ads_iframe_/1090369/C1_0" title="3rd party ad content" name="google_ads_iframe_/1090369/C1_0" width="300" height="250" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" style="border: 0px; vertical-align: bottom;" data-google-container-id="1" data-load-complete="true" src="./Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园_files/saved_resource.html"></iframe></div></div>
    </div>
    <div id="under_post_news"><div class="recomm-block"><b>相关博文：</b><br>·  <a title="dubbo 教程" href="https://www.cnblogs.com/xujiming/p/5449065.html" target="_blank" onclick="clickRecomItmem(5449065)">dubbo 教程</a><br>·  <a title="Dubbo入门简介（一）" href="https://www.cnblogs.com/belen/p/4802518.html" target="_blank" onclick="clickRecomItmem(4802518)">Dubbo入门简介（一）</a><br>·  <a title="Dubbo的配置及使用" href="https://www.cnblogs.com/lilixin/p/5724976.html" target="_blank" onclick="clickRecomItmem(5724976)">Dubbo的配置及使用</a><br>·  <a title="dubbo介绍以及创建" href="https://www.cnblogs.com/fengli9998/p/6800818.html" target="_blank" onclick="clickRecomItmem(6800818)">dubbo介绍以及创建</a><br>·  <a title="dubbo实现原理简单介绍" href="https://www.cnblogs.com/steven520213/p/7606598.html" target="_blank" onclick="clickRecomItmem(7606598)">dubbo实现原理简单介绍</a><br>»  <a target="_blank" href="https://recomm.cnblogs.com/blogpost/9002663">更多推荐...</a><div id="cnblogs_t5"><a href="https://developer.aliyun.com/article/718649?utm_content=g_1000088936" target="_blank" onclick="ga(&#39;send&#39;, &#39;event&#39;, &#39;Link&#39;, &#39;click&#39;, &#39;T5-阿里云开发者社区&#39;)">这6种编码方法，你掌握了几个？</a></div></div></div>
    <div id="cnblogs_c2" class="c_ad_block">
        <div id="div-gpt-ad-1539008685004-0" style="height:60px; width:468px;" data-google-query-id="CKn-g5Hr2ucCFUqTvQod8ZcKBg">
            <script>
                if (new Date() >= new Date(2018, 9, 13)) {
                    googletag.cmd.push(function () { googletag.display("div-gpt-ad-1539008685004-0"); });
                }
            </script>
        <div id="google_ads_iframe_/1090369/C2_0__container__" style="border: 0pt none; width: 468px; height: 60px;"></div></div>
    </div>
    <div id="under_post_kb">
<div class="itnews c_ad_block">
    <b>最新 IT 新闻</b>:
    <br>
 ·              <a href="https://news.cnblogs.com/n/655935/" target="_blank">下一次比特币采矿回报减半即将到来</a>
            <br>
 ·              <a href="https://news.cnblogs.com/n/655934/" target="_blank">京东物流向小微企业免费开放供应链物流管理软件系统</a>
            <br>
 ·              <a href="https://news.cnblogs.com/n/655933/" target="_blank">网校品牌"果肉网校"完成两轮过亿元融资</a>
            <br>
 ·              <a href="https://news.cnblogs.com/n/655932/" target="_blank">嫦娥四号顺利进入第十五月昼工作期</a>
            <br>
 ·              <a href="https://news.cnblogs.com/n/655931/" target="_blank">比尔·盖茨夸特斯拉却买了保时捷，马斯克：跟他谈话真没劲</a>
            <br>
    » <a href="https://news.cnblogs.com/" title="IT 新闻" target="_blank">更多新闻...</a>
</div></div>
    <div id="HistoryToday" class="c_ad_block">
<b>历史上的今天：</b>
<br>

2018-05-07    <a href="https://www.cnblogs.com/aspirant/p/9001498.html">Dubbo学习(二) Dubbo 集群容错模式-负载均衡模式</a>
    <br>
2017-05-07    <a href="https://www.cnblogs.com/aspirant/p/6820262.html">Redis 优势以及性能问题</a>
    <br>
</div>
    <script type="text/javascript">
        fixPostBody();
setTimeout(function() { incrementViewCount(cb_entryId); }, 50);        deliverAdT2();
        deliverAdC1();
        deliverAdC2();
        loadNewsAndKb();
        loadBlogSignature();
LoadPostCategoriesTags(cb_blogId, cb_entryId);        LoadPostInfoBlock(cb_blogId, cb_entryId, cb_blogApp, cb_blogUserGuid);
        GetPrevNextPost(cb_entryId, cb_blogId, cb_entryCreatedDate, cb_postType);
        loadOptUnderPost();
        GetHistoryToday(cb_blogId, cb_blogApp, cb_entryCreatedDate);
    </script>
</div>
	</div><!--end: forFlow -->
	</div><!--end: mainContent 主体内容容器-->

	<div id="sideBar">
		<div id="sideBarMain">
			
<div id="sidebar_news" class="newsItem"><!--done-->
<h3 class="catListTitle">公告</h3>

<div id="blog-news">
    
    <div id="profile_block">
        昵称：
        <a href="https://home.cnblogs.com/u/aspirant/">
            aspirant
        </a>
        <br>
        园龄：
        <a href="https://home.cnblogs.com/u/aspirant/" title="入园时间：2010-06-01">
            9年8个月
        </a>
        <br>
        粉丝：
        <a href="https://home.cnblogs.com/u/aspirant/followers/">
            527
        </a>
        <br>
        关注：
        <a href="https://home.cnblogs.com/u/aspirant/followees/">
            20
        </a>
        <div id="p_b_follow">
<a href="javascript:void(0)" onclick="follow(&#39;02140087-6e6d-df11-ba8f-001cf0cd104b&#39;)">+加关注</a></div>
        <script>getFollowStatus('02140087-6e6d-df11-ba8f-001cf0cd104b');</script>
    </div>
</div>

</div>

			<div id="blog-calendar" style="">

<table id="blogCalendar" class="Cal" cellspacing="0" cellpadding="0" title="Calendar" border="0">
    <tbody>
        <tr>
            <td colspan="7">
                <table class="CalTitle" cellspacing="0" border="0">
                    <tbody>
                        <tr>
                            <td class="CalNextPrev">
                                <a href="javascript:void(0);" onclick="loadBlogCalendar(&#39;2020/01/18&#39;); return false;">&lt;</a>
                            </td>
                            <td align="center">2020年2月</td>
                            <td align="right" class="CalNextPrev">
                                <a href="javascript:void(0);" onclick="loadBlogCalendar(&#39;2020/03/18&#39;); return false;">&gt;</a>
                            </td>
                        </tr>
                    </tbody>
                </table>
            </td>
        </tr>
        <tr>
                    <th class="CalDayHeader" align="center" abbr="日" scope="col">日</th>
                    <th class="CalDayHeader" align="center" abbr="一" scope="col">一</th>
                    <th class="CalDayHeader" align="center" abbr="二" scope="col">二</th>
                    <th class="CalDayHeader" align="center" abbr="三" scope="col">三</th>
                    <th class="CalDayHeader" align="center" abbr="四" scope="col">四</th>
                    <th class="CalDayHeader" align="center" abbr="五" scope="col">五</th>
                    <th class="CalDayHeader" align="center" abbr="六" scope="col">六</th>
        </tr>
            <tr>
                            <td class="CalOtherMonthDay" align="center">26</td>
                            <td class="CalOtherMonthDay" align="center">27</td>
                            <td class="CalOtherMonthDay" align="center">28</td>
                            <td class="CalOtherMonthDay" align="center">29</td>
                            <td class="CalOtherMonthDay" align="center">30</td>
                            <td class="CalOtherMonthDay" align="center">31</td>
                    <td class="CalWeekendDay" align="center">
                        1
                    </td>
            </tr>
                <tr>
                        <td class="CalWeekendDay" align="center">
                            2
                        </td>
                            <td class="" align="center">
                                3
                            </td>
                            <td class="" align="center">
                                4
                            </td>
                            <td class="" align="center">
                                <a href="https://www.cnblogs.com/aspirant/archive/2020/02/05.html"><u>5</u></a>
                            </td>
                            <td class="" align="center">
                                6
                            </td>
                            <td class="" align="center">
                                7
                            </td>
                        <td class="CalWeekendDay" align="center">
                            8
                        </td>
                </tr>
                <tr>
                        <td class="CalWeekendDay" align="center">
                            9
                        </td>
                            <td class="" align="center">
                                <a href="https://www.cnblogs.com/aspirant/archive/2020/02/10.html"><u>10</u></a>
                            </td>
                            <td class="" align="center">
                                <a href="https://www.cnblogs.com/aspirant/archive/2020/02/11.html"><u>11</u></a>
                            </td>
                            <td class="" align="center">
                                12
                            </td>
                            <td class="" align="center">
                                13
                            </td>
                            <td class="" align="center">
                                14
                            </td>
                        <td class="CalWeekendDay" align="center">
                            15
                        </td>
                </tr>
                <tr>
                        <td class="CalWeekendDay" align="center">
                            16
                        </td>
                            <td class="" align="center">
                                17
                            </td>
                            <td class="CalTodayDay" align="center">
                                18
                            </td>
                            <td class="" align="center">
                                19
                            </td>
                            <td class="" align="center">
                                20
                            </td>
                            <td class="" align="center">
                                21
                            </td>
                        <td class="CalWeekendDay" align="center">
                            22
                        </td>
                </tr>
                <tr>
                        <td class="CalWeekendDay" align="center">
                            23
                        </td>
                            <td class="" align="center">
                                24
                            </td>
                            <td class="" align="center">
                                25
                            </td>
                            <td class="" align="center">
                                26
                            </td>
                            <td class="" align="center">
                                27
                            </td>
                            <td class="" align="center">
                                28
                            </td>
                        <td class="CalWeekendDay" align="center">
                            29
                        </td>
                </tr>
                <tr>
                        <td class="CalOtherMonthDay" align="center">
                            1
                        </td>
                            <td class="CalOtherMonthDay" align="center">
                                2
                            </td>
                            <td class="CalOtherMonthDay" align="center">
                                3
                            </td>
                            <td class="CalOtherMonthDay" align="center">
                                4
                            </td>
                            <td class="CalOtherMonthDay" align="center">
                                5
                            </td>
                            <td class="CalOtherMonthDay" align="center">
                                6
                            </td>
                        <td class="CalOtherMonthDay" align="center">
                            7
                        </td>
                </tr>
    </tbody>
</table></div><script>loadBlogDefaultCalendar();</script>
			
			<div id="leftcontentcontainer">
				<div id="blog-sidecolumn">
<!-- 搜索 -->
<div id="sidebar_search" class="sidebar-block">
    <div id="sidebar_search" class="mySearch">
        <h3 class="catListTitle">搜索</h3>
        <div id="sidebar_search_box">
            <div id="widget_my_zzk" class="div_my_zzk">
                <input type="text" id="q" onkeydown="return zzk_go_enter(event);" class="input_my_zzk">&nbsp;<input onclick="zzk_go()" type="button" value="找找看" id="btnZzk" class="btn_my_zzk">
            </div>
            <div id="widget_my_google" class="div_my_zzk">
                <input type="text" name="google_q" id="google_q" onkeydown="return google_go_enter(event);" class="input_my_zzk">&nbsp;<input onclick="google_go()" type="button" value="谷歌搜索" class="btn_my_zzk">
            </div>
        </div>
    </div>
</div>

<!-- 常用链接 -->
<div id="sidebar_shortcut" class="sidebar-block">
    <div class="catListLink">
<h3 class="catListTitle">
常用链接
</h3>
<ul>
		<li>

<a href="https://www.cnblogs.com/aspirant/p/" title="我的博客的随笔列表">我的随笔</a>
</li>
		<li>

<a href="https://www.cnblogs.com/aspirant/MyComments.html" title="我的发表过的评论列表">我的评论</a>
</li>
		<li>

<a href="https://www.cnblogs.com/aspirant/OtherPosts.html" title="我评论过的随笔列表">我的参与</a>
</li>
		<li>

<a href="https://www.cnblogs.com/aspirant/RecentComments.html" title="我的博客的评论列表">最新评论</a>
</li>
		<li>

<a href="https://www.cnblogs.com/aspirant/tag/" title="我的博客的标签列表">我的标签</a>
</li>

</ul>
<div id="itemListLin_con" style="display:none;">
<ul>

</ul>
</div>
</div>


</div>

<!-- 最新随笔 -->



<!-- 我的标签 -->
<div id="sidebar_toptags" class="sidebar-block">
    <div class="catListTag">
<h3 class="catListTitle">我的标签</h3>
<ul>

        <li>
            <a href="https://www.cnblogs.com/aspirant/tag/C%20%20%E6%9B%BF%E6%8D%A2%E5%AD%97%E7%AC%A6%20strtok/">C  替换字符 strtok</a>(1)
        </li>

</ul>
</div>


</div>

<!-- 积分与排名 -->


<!-- 随笔分类、随笔档案、文章分类、新闻分类、相册、链接 -->
<div id="sidebar_categories">
    
        <div id="sidebar_postcategory" class="catListPostCategory sidebar-block">
            <h3 class="catListTitle">
                

随笔分类



            </h3>


            <ul>

                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1625108.html" rel="" target="">
    alibaba-阿里巴巴-生活感想(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1619890.html" rel="" target="">
    alibaba-阿里工作知识(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/528607.html" rel="" target="">
    Android(32)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/856674.html" rel="" target="">
    Android Studio(16)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/555925.html" rel="" target="">
    Android-Java --接收发送消息的系统
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/666100.html" rel="" target="">
    ANT MAKE 部署问题(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/856973.html" rel="" target="">
    Architecture_架构知识(16)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1041911.html" rel="" target="">
    Bat 脚本(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/250520.html" rel="" target="">
    Bugzilla
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/633615.html" rel="" target="">
    C 设计模式(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/556780.html" rel="" target="">
    C 语言知识(13)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/666099.html" rel="" target="">
    C++ 问题
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/671164.html" rel="" target="">
    Cache(15)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1562043.html" rel="" target="">
    code standard-代码规范(4)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/567839.html" rel="" target="">
    C--基础知识(5)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/560576.html" rel="" target="">
    Data Structure-数据结构算法(33)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/773065.html" rel="" target="">
    DB_数据库(57)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/900417.html" rel="" target="">
    DCloud 问题(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1184603.html" rel="" target="">
    Deployment 部署知识(32)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1540368.html" rel="" target="">
    Distributed-分布式系统(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1111046.html" rel="" target="">
    DOS命令(2)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/585149.html" rel="" target="">
    Eclipse(11)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/956121.html" rel="" target="">
    ETL_数据挖掘(8)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1040509.html" rel="" target="">
    Fitness_健身(2)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1187023.html" rel="" target="">
    Hibernate(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/581827.html" rel="" target="">
    HTTP-TCP-Socket IO NIO(34)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/548388.html" rel="" target="">
    Interview_面试(40)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/628544.html" rel="" target="">
    IPV6
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/526610.html" rel="" target="">
    Java 基础知识(67)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1364521.html" rel="" target="">
    Java-1.8新特性(7)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1224816.html" rel="" target="">
    Java-调度(3)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1195271.html" rel="" target="">
    Java-加载类-内存分配回收-调优(16)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1024672.html" rel="" target="">
    Java设计模式(19)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1563027.html" rel="" target="">
    key-encrypt-加解密(2)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/552051.html" rel="" target="">
    Linux C知识(16)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/573369.html" rel="" target="">
    Linux挂载点(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/551952.html" rel="" target="">
    Linux知识(28)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1454345.html" rel="" target="">
    lock 锁问题(9)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1433971.html" rel="" target="">
    log-日志解析(2)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1261053.html" rel="" target="">
    MAC Idea 环境问题(25)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1556916.html" rel="" target="">
    MAC 环境问题(13)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1017510.html" rel="" target="">
    MAVEN(29)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1634490.html" rel="" target="">
    Meeting-开会或者做PPT演讲的技能(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1195858.html" rel="" target="">
    MQ消息队列-MQ(8)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1017858.html" rel="" target="">
    Multi_Thread多线程(32)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1011559.html" rel="" target="">
    Political_时事政治(4)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1578666.html" rel="" target="">
    ProjectManager管理-个人发展(11)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/952301.html" rel="" target="">
    Python(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1239496.html" rel="" target="">
    Search-搜索引擎(2)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/599725.html" rel="" target="">
    Servlet(2)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1012476.html" rel="" target="">
    SPRING(38)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1364562.html" rel="" target="">
    Spring Boot(7)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1212226.html" rel="" target="">
    Spring Cloud_dubbo等(16)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1266026.html" rel="" target="">
    Thrift(3)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1434145.html" rel="" target="">
    transaction-事务(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/526171.html" rel="" target="">
    博客杂谈(27)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/810034.html" rel="" target="">
    个人项目(5)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1442070.html" rel="" target="">
    美团(8)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/556095.html" rel="" target="">
    语言编码(6)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/category/1560410.html" rel="" target="">
    正则表达式(1)
</a>
 

                        </li>

            </ul>


        </div>
        <div id="sidebar_postarchive" class="catListPostArchive sidebar-block">
            <h3 class="catListTitle">
                

随笔档案



            </h3>


            <ul>

                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2020/02.html" rel="" target="">
    2020年2月(4)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2020/01.html" rel="" target="">
    2020年1月(21)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2019/12.html" rel="" target="">
    2019年12月(24)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2019/11.html" rel="" target="">
    2019年11月(7)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2019/10.html" rel="" target="">
    2019年10月(27)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2019/09.html" rel="" target="">
    2019年9月(31)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2019/08.html" rel="" target="">
    2019年8月(8)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2019/07.html" rel="" target="">
    2019年7月(16)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2019/06.html" rel="" target="">
    2019年6月(6)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2019/05.html" rel="" target="">
    2019年5月(3)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2019/04.html" rel="" target="">
    2019年4月(24)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2019/03.html" rel="" target="">
    2019年3月(18)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2019/02.html" rel="" target="">
    2019年2月(14)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2019/01.html" rel="" target="">
    2019年1月(18)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2018/12.html" rel="" target="">
    2018年12月(16)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2018/11.html" rel="" target="">
    2018年11月(5)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2018/10.html" rel="" target="">
    2018年10月(5)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2018/09.html" rel="" target="">
    2018年9月(10)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2018/08.html" rel="" target="">
    2018年8月(10)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2018/07.html" rel="" target="">
    2018年7月(6)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2018/06.html" rel="" target="">
    2018年6月(17)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2018/05.html" rel="" target="">
    2018年5月(42)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2018/04.html" rel="" target="">
    2018年4月(40)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2018/03.html" rel="" target="">
    2018年3月(40)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2018/02.html" rel="" target="">
    2018年2月(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2018/01.html" rel="" target="">
    2018年1月(6)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2017/12.html" rel="" target="">
    2017年12月(4)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2017/11.html" rel="" target="">
    2017年11月(7)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2017/10.html" rel="" target="">
    2017年10月(8)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2017/09.html" rel="" target="">
    2017年9月(7)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2017/08.html" rel="" target="">
    2017年8月(2)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2017/07.html" rel="" target="">
    2017年7月(27)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2017/06.html" rel="" target="">
    2017年6月(25)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2017/05.html" rel="" target="">
    2017年5月(15)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2017/04.html" rel="" target="">
    2017年4月(11)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2017/03.html" rel="" target="">
    2017年3月(3)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2017/02.html" rel="" target="">
    2017年2月(2)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2017/01.html" rel="" target="">
    2017年1月(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2016/12.html" rel="" target="">
    2016年12月(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2016/10.html" rel="" target="">
    2016年10月(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2016/09.html" rel="" target="">
    2016年9月(2)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2016/08.html" rel="" target="">
    2016年8月(5)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2016/07.html" rel="" target="">
    2016年7月(10)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2016/06.html" rel="" target="">
    2016年6月(2)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2016/05.html" rel="" target="">
    2016年5月(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2016/04.html" rel="" target="">
    2016年4月(2)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2016/03.html" rel="" target="">
    2016年3月(2)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2016/02.html" rel="" target="">
    2016年2月(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2016/01.html" rel="" target="">
    2016年1月(2)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2015/12.html" rel="" target="">
    2015年12月(2)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2015/09.html" rel="" target="">
    2015年9月(5)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2015/03.html" rel="" target="">
    2015年3月(2)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2014/12.html" rel="" target="">
    2014年12月(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2014/11.html" rel="" target="">
    2014年11月(7)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2014/10.html" rel="" target="">
    2014年10月(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2014/09.html" rel="" target="">
    2014年9月(1)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2014/07.html" rel="" target="">
    2014年7月(6)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2014/06.html" rel="" target="">
    2014年6月(3)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2014/05.html" rel="" target="">
    2014年5月(8)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2014/04.html" rel="" target="">
    2014年4月(5)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2014/03.html" rel="" target="">
    2014年3月(12)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2014/02.html" rel="" target="">
    2014年2月(25)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2014/01.html" rel="" target="">
    2014年1月(6)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2013/12.html" rel="" target="">
    2013年12月(7)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2013/10.html" rel="" target="">
    2013年10月(13)
</a>
 

                        </li>
                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/archive/2010/06.html" rel="" target="">
    2010年6月(1)
</a>
 

                        </li>

            </ul>


        </div>
        <div id="sidebar_imagecategory" class="catListImageCategory sidebar-block">
            <h3 class="catListTitle">
                

相册



            </h3>


            <ul>

                        <li>
                            
<a href="https://www.cnblogs.com/aspirant/gallery/1511166.html" rel="nofollow noopener noreferrer" target="">
    美团(1)
</a>
 

                        </li>

            </ul>


        </div>

</div>

<!-- 最新评论 -->
<div id="sidebar_recentcomments" class="sidebar-block">
    <div class="catListComment">
<h3 class="catListTitle">最新评论</h3>

	<div class="RecentCommentBlock">
        <ul>
                    <li class="recent_comment_title"><a href="https://www.cnblogs.com/aspirant/p/9183920.html#4497163">1. Re:Threadlocal  传递参数(百度二面)</a></li>
                    <li class="recent_comment_body">厉害了，本来只想查下ThreadLocal，结果翻到阿里大佬的blog了</li>
                    <li class="recent_comment_author">--worstProgrammer</li>
                    <li class="recent_comment_title"><a href="https://www.cnblogs.com/aspirant/p/9089146.html#4496270">2. Re:Dubbo和Spring Cloud微服务架构比较</a></li>
                    <li class="recent_comment_body">大佬您好<br> dubbo组件运行流程中提及的gateway， 有啥可推荐的开源的吗？ 谢谢</li>
                    <li class="recent_comment_author">--e30021</li>
                    <li class="recent_comment_title"><a href="https://www.cnblogs.com/aspirant/p/12131727.html#4496139">3. Re:工作-感觉越来越难了</a></li>
                    <li class="recent_comment_body">加油！！！</li>
                    <li class="recent_comment_author">--zzxkj</li>
                    <li class="recent_comment_title"><a href="https://www.cnblogs.com/aspirant/p/12033353.html#4486641">4. Re:Mac修改hosts方法</a></li>
                    <li class="recent_comment_body">可以下一个host管理工具，switchhost，挺好用的</li>
                    <li class="recent_comment_author">--最爱吃年糕</li>
                    <li class="recent_comment_title"><a href="https://www.cnblogs.com/aspirant/p/12055217.html#4486640">5. Re:晚上想想千条路，早上起来走老路</a></li>
                    <li class="recent_comment_body">老哥加油。</li>
                    <li class="recent_comment_author">--最爱吃年糕</li>
        </ul>
    </div>
</div>


</div>



<!-- 阅读排行榜 -->
<div id="sidebar_topviewedposts" class="sidebar-block">
    <div class="catListView">
<h3 class="catListTitle">阅读排行榜</h3>
	<div id="TopViewPostsBlock">
        <ul style="word-break:break-all">
                    <li>
                        <a href="https://www.cnblogs.com/aspirant/p/5697807.html">
                            1. 分布式与集群的区别是什么？(130394)
                        </a>
                    </li>
                    <li>
                        <a href="https://www.cnblogs.com/aspirant/p/3604801.html">
                            2. No space left on device   解决Linux系统磁盘空间满的办法(99549)
                        </a>
                    </li>
                    <li>
                        <a href="https://www.cnblogs.com/aspirant/p/9166944.html">
                            3. select、poll、epoll之间的区别(搜狗面试)(67341)
                        </a>
                    </li>
                    <li>
                        <a href="https://www.cnblogs.com/aspirant/p/9082858.html">
                            4. BeanFactory 简介以及它 和FactoryBean的区别(阿里面试)(62529)
                        </a>
                    </li>
                    <li>
                        <a href="https://www.cnblogs.com/aspirant/p/6920418.html">
                            5. Java-线程池专题 (美团)(56621)
                        </a>
                    </li>
        </ul>
    </div>
</div>


</div>

<!-- 评论排行榜 -->
<div id="sidebar_topcommentedposts" class="sidebar-block">
    <div class="catListFeedback">
<h3 class="catListTitle">评论排行榜</h3>
	<div id="TopFeedbackPostsBlock">
        <ul style="word-break:break-all">
                    <li>
                        <a href="https://www.cnblogs.com/aspirant/p/5697807.html">
                            1. 分布式与集群的区别是什么？(21)
                        </a>
                    </li>
                    <li>
                        <a href="https://www.cnblogs.com/aspirant/p/7200523.html">
                            2. Java 类加载机制(阿里)-何时初始化类(6)
                        </a>
                    </li>
                    <li>
                        <a href="https://www.cnblogs.com/aspirant/p/9166944.html">
                            3. select、poll、epoll之间的区别(搜狗面试)(6)
                        </a>
                    </li>
                    <li>
                        <a href="https://www.cnblogs.com/aspirant/p/8662690.html">
                            4. JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)(5)
                        </a>
                    </li>
                    <li>
                        <a href="https://www.cnblogs.com/aspirant/p/9082858.html">
                            5. BeanFactory 简介以及它 和FactoryBean的区别(阿里面试)(5)
                        </a>
                    </li>
        </ul>
    </div>
</div>


</div>

<!-- 推荐排行榜 -->
<div id="sidebar_topdiggedposts" class="sidebar-block">
    
<div id="topdigg_posts_wrap">
    <div class="catListView">
        <h3 class="catListTitle">推荐排行榜</h3>
        <div id="TopDiggPostsBlock">
            <ul style="word-break: break-all">
                        <li>
                            <a href="https://www.cnblogs.com/aspirant/p/5697807.html">
                                1. 分布式与集群的区别是什么？(56)
                            </a>
                        </li>
                        <li>
                            <a href="https://www.cnblogs.com/aspirant/p/9166944.html">
                                2. select、poll、epoll之间的区别(搜狗面试)(17)
                            </a>
                        </li>
                        <li>
                            <a href="https://www.cnblogs.com/aspirant/p/9082858.html">
                                3. BeanFactory 简介以及它 和FactoryBean的区别(阿里面试)(15)
                            </a>
                        </li>
                        <li>
                            <a href="https://www.cnblogs.com/aspirant/p/6877350.html">
                                4. IO复用,AIO,BIO,NIO,同步，异步，阻塞和非阻塞 区别(百度)(13)
                            </a>
                        </li>
                        <li>
                            <a href="https://www.cnblogs.com/aspirant/p/8662690.html">
                                5. JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)(9)
                            </a>
                        </li>
            </ul>
        </div>
    </div>
</div>
</div></div>
                    <script>loadBlogSideColumn();</script>
			</div>
			
		</div><!--end: sideBarMain -->
	</div><!--end: sideBar 侧边栏容器 -->
	<div class="clear"></div>
	</div><!--end: main -->
	<div class="clear"></div>
	<div id="footer">
		<!--done-->
Copyright © 2020 aspirant
<br><span id="poweredby">Powered by .NET Core on Linux</span>



	</div><!--end: footer -->
</div><!--end: home 自定义的最大容器 -->


    

<style>QUZHUANPAN-PLUGIN {display: inline;cursor: pointer;}QUZHUANPAN-PLUGIN-TIPS {white-space: nowrap;}.QUZHUANPAN-PLUGIN-VALIDATE-NOTPASS {text-decoration: line-through;color: #ccc;}QUZHUANPAN-PLUGIN-TIPS::before {background-position: center;background-size: 100% 100%;background-repeat: no-repeat;box-sizing: border-box;width: 1em;height: 1em;margin: 0 1px .15em 1px;vertical-align: middle;display: inline-block;}.QUZHUANPAN-PLUGIN-VALIDATE-NOTPASS>QUZHUANPAN-PLUGIN-TIPS::before {content: '';background-image: url(http://www.quzhuanpan.com/media/tampermonkey/tips/error.png)}.QUZHUANPAN-PLUGIN-VALIDATE-PASS>QUZHUANPAN-PLUGIN-TIPS::before {content: '';background-image: url(http://www.quzhuanpan.com/media/tampermonkey/tips/success.png)}.QUZHUANPAN-PLUGIN-VALIDATE-UNCERTAINTY>QUZHUANPAN-PLUGIN-TIPS::before {content: '';background-image: url(http://www.quzhuanpan.com/media/tampermonkey/tips/uncertainty.png)}.QUZHUANPAN-PLUGIN-VALIDATE-LOCK>QUZHUANPAN-PLUGIN-TIPS::before{content: '';background-image: url(http://www.quzhuanpan.com/media/tampermonkey/tips/lock.png)}</style></body></html>